iT邦幫忙

2023 iThome 鐵人賽

DAY 5
0

CSP (Communicating Sequential Processes)

CSP(Communicating Sequential Processes)是一種用於描述並行系統之間互動的形式模型。在這種模型中,獨立的實體(或稱為進程)並行運行,但它們只通過通信來互動,而不是共享記憶體。這種模型的主要目的是將注意力從低級的記憶體管理轉移到更高級的互動模式。


Go語言中的CSP運用

Go語言深受CSP模型的啟發。在Go中,這主要體現在goroutines和channels的使用。

  1. goroutines:在Go中,併發執行的單位稱為goroutine。它比傳統的線程更加輕量,且開銷小。

  2. channels:channels是Go中提供的一種通信機制,允許不同的goroutines之間發送和接收數據。

通過使用goroutines和channels,Go提供了一種簡單而強大的方式來建立並行程序,而不需要直接處理複雜的鎖和共享記憶體問題。


"Don't communicate by sharing memory; share memory by communicating"

這句格言反映了Go的核心哲學。傳統上,多線程的程式經常透過共享記憶體來進行通訊。這往往導致競態條件、死鎖等問題,開發者必須使用各種鎖來避免這些問題,這使得程式碼變得複雜且難以維護。

Go的策略是鼓勵開發者使用Channels來傳遞數據,而不是直接共享記憶體。這意味著,而不是讓多個goroutines去讀/寫同一塊記憶體,你可以將數據從一個goroutine "傳送" 到另一個。這降低了競態條件的風險,並使得程式碼更為清晰和直觀。

package main

import (
	"fmt"
	"time"
)

func sendData(ch chan int) {
	for i := 0; i < 5; i++ {
		ch <- i  // 將數據"傳送"到channel中
		time.Sleep(time.Millisecond * 50)
	}
	close(ch) // 關閉channel,表示不再發送數據
}

func main() {
	ch := make(chan int) // 創建一個整數型態的channel

	go sendData(ch) // 啟動一個goroutine來發送數據

	// 從channel中接收數據,直到channel被關閉
	for data := range ch {
		fmt.Println(data)
	}
}

我們定義了一個sendData函數,它接受一個整數channel作為參數。該函數將五個整數逐一發送到channel中。

main函數中,我們首先創建了一個整數channel,然後啟動了一個goroutine來呼叫sendData函數。

主goroutine繼續運行,並開始從channel中接收數據。當sendData函數中的所有數據都已發送並且channel已關閉時,主goroutine將停止接收數據。

在整個範例中,數據的傳輸完全通過channel完成,而不是直接通過共享記憶體。體現了Go的CSP。


上一篇
4.Deadlocks, Livelocks, and Starvation
下一篇
6.Goroutine
系列文
Concurrency in go 讀書心得30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言